package org.posupe.instituicoesEnsino;

import org.posupe.util.RepositorioException;

public class RepositorioInstituicoesEnsinoLista implements RepositorioInstituicoesEnsino {
	
    private InstituicaoEnsino instituicaoEnsino;
    private RepositorioInstituicoesEnsinoLista proximo;
    private int tamanho;
    
    public void inserir(InstituicaoEnsino instituicaoEnsino) throws RepositorioException {
		if (this.instituicaoEnsino == null) {
			this.instituicaoEnsino = instituicaoEnsino;
			this.proximo = new RepositorioInstituicoesEnsinoLista();
		} else {			
			this.proximo.inserir(instituicaoEnsino);
		}
		this.tamanho = tamanho+1;
	}
	
	public void remover(int codigo) throws InstituicaoEnsinoInexistenteException,RepositorioException{
		if (this.instituicaoEnsino != null) {
			if (this.instituicaoEnsino.getCodigo() == codigo) {
				this.instituicaoEnsino = this.proximo.instituicaoEnsino;
				this.proximo = this.proximo.proximo;
			} else {
				this.proximo.remover(codigo);
			}
		} else {
			throw new InstituicaoEnsinoInexistenteException(codigo);
		}
		this.tamanho = tamanho - 1;
	}
	
	public InstituicaoEnsino procurar(int codigo) throws InstituicaoEnsinoInexistenteException,RepositorioException {
		InstituicaoEnsino resultado = null;
		
		if (this.instituicaoEnsino != null) {
			if (this.instituicaoEnsino.getCodigo() == codigo) {
				resultado = this.instituicaoEnsino;
			} else {
				resultado = this.proximo.procurar(codigo);
			}
		} else {
			throw new InstituicaoEnsinoInexistenteException(codigo);
		}
		
		return resultado;
	}
	
	public IteratorInstituicoesEnsino procurar(InstituicaoEnsino instituicaoEnsino)throws RepositorioException{
		IteratorInstituicoesEnsinoVector resposta = new IteratorInstituicoesEnsinoVector();
		IteratorInstituicoesEnsino instituicoesEnsino = this.getIterator();

		while (instituicoesEnsino.hasNext()){
			InstituicaoEnsino inst = instituicoesEnsino.next();
			if (instituicaoEnsino.match(inst)){
				resposta.add(inst);
			}
		}

		return resposta;
	}
	
	public IteratorInstituicoesEnsino getIterator() throws RepositorioException {
		IteratorInstituicoesEnsinoVector resposta = new IteratorInstituicoesEnsinoVector();
		RepositorioInstituicoesEnsinoLista proxima = this;
		int contador = 0;

		while (contador < this.tamanho) {
			resposta.add(proxima.instituicaoEnsino);
			proxima = proxima.proximo;
			contador++;
		}

		return resposta;
	}



	public boolean existe(int codigo) throws RepositorioException{
		boolean resultado = false;
		
		if (this.instituicaoEnsino != null) {
			if (this.instituicaoEnsino.getCodigo() == codigo) {
				resultado = true;
			} else {
				resultado = this.proximo.existe(codigo);
			}				
		}
		
		return resultado;
	}
	
	public void atualizar(InstituicaoEnsino instituicaoEnsino) throws InstituicaoEnsinoInexistenteException,RepositorioException{
		if(this.instituicaoEnsino != null){
			if(this.instituicaoEnsino.getCodigo() == instituicaoEnsino.getCodigo()){
				this.instituicaoEnsino = instituicaoEnsino;
			}else{
				this.proximo.atualizar(instituicaoEnsino);
			}		}else{
			throw new InstituicaoEnsinoInexistenteException(instituicaoEnsino.getCodigo());
		}
	}

}
